#include "graph_adjacency_matrix.h"

#include <stdexcept> 
#include "print_graph.h"

GraphAdjMat::GraphAdjMat(const std::vector<int>& vertices, const std::vector<std::vector<int>>& edges)
{
    // 添加顶点
    for (int val : vertices)
    {
        addVertex(val);
    }
    // 添加边
    // 请注意，edges 元素代表顶点索引，即对应 vertices 元素索引
    for (const std::vector<int>& edge : edges)
    {
        addEdge(edge[0], edge[1]);
    }
}

int GraphAdjMat::size() const
{
    return vertices.size();
}

void GraphAdjMat::addVertex(int val)
{
    int n = size();
    // 向顶点列表中添加新顶点的值
    vertices.push_back(val);
    // 在邻接矩阵中添加一行
    adjMat.emplace_back(std::vector<int>(n, 0));
    // 在邻接矩阵中添加一列
    for (std::vector<int>& row : adjMat)
    {
        row.push_back(0);
    }
}

void GraphAdjMat::removeVertex(int index)
{
    if (index >= size())
    {
        //throw out_of_range("顶点不存在");
        throw std::out_of_range("verter not exists");
    }
    // 在顶点列表中移除索引 index 的顶点
    vertices.erase(vertices.begin() + index);
    // 在邻接矩阵中删除索引 index 的行
    adjMat.erase(adjMat.begin() + index);
    // 在邻接矩阵中删除索引 index 的列
    for (std::vector<int>& row : adjMat)
    {
        row.erase(row.begin() + index);
    }
}

void GraphAdjMat::addEdge(int i, int j)
{
    // 索引越界与相等处理
    if (i < 0 || j < 0 || i >= size() || j >= size() || i == j)
    {
        //throw out_of_range("顶点不存在");
        throw std::out_of_range("verter not exists");
    }
    // 在无向图中，邻接矩阵关于主对角线对称，即满足 (i, j) == (j, i)
    adjMat[i][j] = 1;
    adjMat[j][i] = 1;
}

void GraphAdjMat::removeEdge(int i, int j)
{
    // 索引越界与相等处理
    if (i < 0 || j < 0 || i >= size() || j >= size() || i == j)
    {
        //throw out_of_range("顶点不存在");
        throw std::out_of_range("verter not exists");
    }
    adjMat[i][j] = 0;
    adjMat[j][i] = 0;
}

void GraphAdjMat::print()
{
#if 1
    //cout << "顶点列表 = ";
    std::cout << "vertex list = ";
    printVector(vertices);
    //cout << "邻接矩阵 =" << endl;
    std::cout << "adjacency matrix = " << std::endl;
    printVectorMatrix(adjMat);
#endif
}
